FIT2-2021b 第06回 オブジェクト
前回課題の解説
リストの使い方
ボールを増やすには?
b-10-2, b-10-3の解説をする形かな
b-10-3.pyがだいたい下のようになってるはず
code:python
import pyxel # pyxelそのもの
import random # ボールの始点x座標や角度をランダムに決めるために使う
import math # ボールのvx,vyを三角関数から計算するのに使う
pyxel.init(200, 200, fps=300)
pyxel.sound(0).set(note='C3', tone='T', volume='3',
effect='N', speed=30) # 0番の音にC3(高いド)を設定
pyxel.sound(1).set(note='C2', tone='T', volume='3',
effect='N', speed=30) # 1番の音にC2(低いド)を設定
# ボール関連の値
ballx = []
bally = []
vx = []
vy = []
# ボールを1つ初期化して配列に登録
ballx.append(random.randint(0, 199))
bally.append(0)
# vx,vyを計算できればあとは無用なのでリストにする必要がない
angle = math.radians(random.randint(30, 150))
vx.append(math.cos(angle))
vy.append(math.sin(angle))
speed = 1
# 点数管理
score = 0
success = 0 # ボールのキャッチに成功した回数をカウント、10になったら0に戻す仕様
failure = 0 # ボールのキャッチに失敗した回数をカウント、10になったらゲームオーバー
gameover = False # ゲームオーバーかどうか? True / False
# padの大きさ定義
padx = 100
padWidth = 100
padHeight = 10
def update():
global ballx, bally, speed, vx, vy, padx, padWidth, score, failure, gameover, success
if gameover:
return # updateという関数の処理をここで終了する
for i in range(0, len(ballx)):
# ボールとpadの位置を最新化
padx = pyxel.mouse_x
# 各種処理判定
if ballyi >= 200: # ボールが下端まで来てしまった pyxel.play(0, 1) # 失敗の音を再生
# ボールの左右位置をランダムに再設定
ballxi = random.randint(0, 199) # ボールの進行方向や速度を再設定
angle = math.radians(random.randint(30, 150))
speed += 0.05
failure += 1
if 10 <= failure:
gameover = True
# ボールがpadと接触した
if padx - padWidth / 2 <= ballxi <= padx + padWidth / 2 and 195 <= ballyi: pyxel.play(0, 0) # 成功の音を再生
score += 100 # 点数を増やす
# ボールの左右位置をランダムに再設定
ballxi = random.randint(0, 199) # ボールの進行方向や速度を再設定
angle = math.radians(random.randint(30, 150))
speed += 0.5
success += 1
if 10 <= success:
success = 0
# 速度を初期化
speed = 1
# ボールを追加
ballx.append(random.randint(0, 199))
bally.append(0)
angle = math.radians(random.randint(30, 150))
vx.append(math.cos(angle))
vy.append(math.sin(angle))
if ballxi < 0 or 200 < ballxi: # ボールが左右にはみ出した def draw():
global ballx, bally, padx, padWidth, padHeight, score, failure, gameover, success
if gameover:
pyxel.text(80, 100, 'GAME OVER', 3)
else:
pyxel.cls(7)
for i in range(0, len(ballx)):
pyxel.circ(ballxi, ballyi, 10, 6) pyxel.rect(padx - padWidth / 2, 200 -
padHeight, padWidth, padHeight, 14)
pyxel.text(0, 0, 'score: ' + str(score), 0)
pyxel.text(0, 10, 'failure: ' + str(failure), 0)
pyxel.text(0, 20, 'success: ' + str(success), 0)
pyxel.run(update, draw)
第6回講義
https://gyazo.com/d71a24f8b6b0f2838533f25c8dcee899
クラス、インスタンス、メソッド
よりコードの塊に意味を持たせ、可読性とメンテナンス性を高める
code:python
ballx += vx * speed
bally += vy * speed
これを
code:python
Class Ball:
speed = 1
def __init__(self):
self.x = 0
self.y = 0
self.vx = 0
self.vy = 0
def move(self):
self.x += self.vx * Ball.speed
self.y += self.vy * Ball.speed
ball = Ball()
ball.move()
こうできる話
どんな企画が出来るか紹介
適切な制約さえつければ割とどんなゲームでも作れてしまうのがpyxelのすごいところ
ブロック崩し
すごろく
音ゲー
ノベルゲー
シューティングゲーム
ダンジョン探索ゲーム